package com.ilxqx.framework.generator.data;

import com.ilxqx.framework.generator.constant.GenerationConfigConstants;
import com.ilxqx.framework.generator.parser.Table;
import com.ilxqx.framework.generator.parser.TableField;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.Map;

/**
 * 数据库与java特定类型转换处理
 * @author venus
 */
@ProcessingOrder(3)
@Slf4j
public class TypeConverterDataModelProcessing implements DataModelProcessing {

	/**
	 * 类型转换规则名称
	 */
	private static final String TYPE_CONVERT_FLAG = "typeConvert";

	/**
	 * 转换目标类的参数名称
	 */
	private static final String PARAMETER_FLAG = "class";

	/**
	 * 数据模型处理
	 *
	 * @param dataModel 数据模型(其中table为表对象，里面包含你想要的信息)
	 */
	@Override
	public void process(Map<String, Object> dataModel) {
		Table table = (Table) dataModel.get("table");
		for (TableField field : table.getFields()) {
			if (field.getRules().match(TYPE_CONVERT_FLAG)) {
				String halfClass = field.getRules().getRule(TYPE_CONVERT_FLAG).getParam(PARAMETER_FLAG);
				if (StringUtils.isBlank(halfClass)) {
					// 直接跳过
					continue;
				}

				// 先尝试着加载一次
				Class cls = this.tryLoadClass(halfClass);
				if (cls == null) {
					// 用全路径尝试加载
					String fullClass = GenerationConfigConstants.FRAMEWORK_PACKAGE + "." + halfClass;
					cls = this.tryLoadClass(fullClass);
				}
				// 加载类
				if (cls != null) {
					field.setType(cls);
				}
			}
		}
	}

	/**
	 * 尝试加载类
	 * @param classPath 类路径
	 * @return 加载后的类
	 */
	private Class<?> tryLoadClass(String classPath) {
		try {
			return Class.forName(classPath);
		} catch (ClassNotFoundException e) {
			log.warn("需要转换的目标类[{}]找不到", classPath);
		}
		return null;
	}

}
